package com.senlingspace.payment.douyin.bean.request;

import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.senlingspace.payment.douyin.DouyinFunctionEnum;
import com.senlingspace.payment.douyin.bean.response.DouyinRefundResponse;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 商户主动发起退款-请求参数
 *
 * @author lebronjames
 * @date 2024/08/02
 */
@Data
public class DouyinRefundRequest implements DouyinRequest<DouyinRefundResponse> {

    /**
     * 开发者侧订单号，长度 <= 64 byte
     * <p>
     * 必传
     */
    @JsonProperty("out_order_no")
    private String outOrderNo;

    /**
     * 开发者侧退款单号，长度 <= 64 byte
     * <p>
     * 必传
     */
    @JsonProperty("out_refund_no")
    private String outRefundNo;

    /**
     * 开发者自定义透传字段，不支持二进制，长度 <= 2048 byte 比如：extra_info
     * <p>
     * 非必传
     */
    @JsonProperty("cp_extra")
    private String cpExtra;

    /**
     * 退款单的跳转的 schema
     * <p>
     * 必传
     */
    @JsonProperty("order_entry_schema")
    private OrderEntrySchema orderEntrySchema;

    /**
     * 退款结果通知地址。
     * 此地址在接入流程行业模版使用指南-消息通知中设置（<a href="https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/open-capacity/Industry/industry_mode/guide/">...</a>）。长度 <=512byte
     * <p>
     * 非必传
     */
    @JsonProperty("notify_url")
    private String notifyUrl;

    /**
     * 需要发起退款的商品单信息，数组长度<100
     * 注意：交易系统订单必传
     */
    @JsonProperty("item_order_detail")
    private List<ItemOrderDetail> itemOrderDetail;

    @Data
    public static class OrderEntrySchema implements Serializable {
        /**
         * 订单详情页路径，没有前导的/，该字段不能为空，长度 <= 512byte
         * 比如：pages/indexx
         * <p>
         * 必传
         */
        @JsonProperty("path")
        private String path;

        /**
         * 路径参数，自定义的 json 结构，序列化成字符串存入该字段，平台不限制，但是写入的内容需要能够保证生成访问订单详情的 schema
         * 能正确跳转到小程序内部的订单详情页，长度 <= 512byte
         * <p>
         * 非必传
         */
        @JsonProperty("params")
        private String params;
    }

    @Data
    public static class ItemOrderDetail implements Serializable {
        /**
         * 商品单号，参见通用参数-重要 ID 字段说明说明（<a href="https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/server/trade-system/self-operated-trading/common-param">...</a>）
         * <p>
         * 必传
         */
        @JsonProperty("item_order_id")
        private String itemOrderId;

        /**
         * 该 item_order 需要退款的金额，单位分，不能大于该 item_order 实付金额且要大于 0
         * 需要指定 item_order 的退款金额，需要申请开通指定金额退款权限才能使用
         * <p>
         * 必传
         */
        @JsonProperty("refund_amount")
        private int refundAmount;
    }

    @Override
    public DouyinFunctionEnum getFunction() {
        return DouyinFunctionEnum.create_refund;
    }

    @Override
    public String getBody() {
        DouyinRefundRequest request = new DouyinRefundRequest();
        request.setOutOrderNo(this.outOrderNo);
        request.setOutRefundNo(this.outOrderNo);
        request.setCpExtra("商品主动发起退款");
        request.setOrderEntrySchema(this.orderEntrySchema);
        request.setNotifyUrl(this.notifyUrl);
        request.setItemOrderDetail(this.itemOrderDetail);
        return JSON.toJSONString(request);
    }

    @Override
    public Class<DouyinRefundResponse> getResponseType() {
        return DouyinRefundResponse.class;
    }

}
